library(tidyverse, warn.conflicts = F)
library(rvest)
library(plotly)
library(cluster)
library(ggdendro)
library(tibble)
source("funcoes_plot.R")
Filme é algo que todo mundo, ou quase todo mundo, gosta. Final de semana em casa sempre combina com aquele filme que você tanto queria assistir. Quanto mais assistimos, mais vamos conhecendo a indústria cinematográfica, nos apegamos a certos atores e começamos a acompanhar o trabalho desses mais de perto. Pensando nisso, esse trabalho propõe analisar o trabalho de uma atriz que é, certamente, conhecida por muita gente. Famosa principalmente por seu trabalho em Star Wars como Padmé Amidala e Nina Sayers em Cisne Negro, Natalie Portman tem tido cada vez mais espaço no em Hollywood. Extraindo dados do site Rotten Tomatoes, um site de críticas de filme, vamos analisar o trabalho dela.
from_page <- read_html("https://www.rottentomatoes.com/celebrity/natalie_portman/") %>%
html_node("#filmographyTbl") %>% # A sintaxe da expressão é de um seletor à lá JQuery: https://rdrr.io/cran/rvest/man/html_nodes.html
html_table(fill=TRUE) %>% # Faz parse
as.tibble()
filmes = from_page %>%
filter(RATING != "No Score Yet",
`BOX OFFICE` != "—",
CREDIT != "Executive Producer") %>%
mutate(RATING = as.numeric(gsub("%", "", RATING)),
`BOX OFFICE` = as.numeric(gsub("[$|M]", "", `BOX OFFICE`))) %>%
filter(`BOX OFFICE` >= 1) # Tem dois filmes que não parecem ter sido lançados no mundo todo
Primeiro, vamos descrever um pouco os dados que vamos trabalhar.
names(filmes)
## [1] "RATING" "TITLE" "CREDIT" "BOX OFFICE" "YEAR"
O “Rating” é a nota atribuída a um filme, sendo calculado de acordo com algumas métricas do Rotten Tomatoes. O “Title” se refere ao título do filme, “Credit” o papel da atriz nele, “Box Office” é o valor que foi arrecadado pelo filme, e “Year” o ano de lançamento. Cada observação nos nossos dados se refere a um filme.
Primeiro, vamos criar um gráfico de pontos para ter uma visualização geral dos dados. Cada ponto representa um filme. O eixo X é a nota do filme e o Y o valor arrecadado. O gráfico é interativo, então passando o mouse sobre cada ponto obtem-se mais dados sobre aquele filme.
plot_ly(data = filmes,
x = filmes$RATING,
y = filmes$`BOX OFFICE`,
text = ~paste("Nome do filme: ", TITLE,
"<br>Ano de Lançamento: ", YEAR,
"<br>Papel: ", CREDIT)
)
Vendo o gráfico acima, é possível perceber que há uma certa semelhança entra os valores de alguns filmes. Há alguns filmes que tem uma grande semelhança entre a nota e faturamento. Com isso, podemos separar os filmes em grupos, onde cada grupo possui filmes com faturamento e nota parecidos. Para isso, vamos utilizar um algoritmo que ajuda a calcular esses grupos.
agrupamento_h_2d = filmes %>%
column_to_rownames("TITLE") %>%
select(RATING, `BOX OFFICE`) %>%
dist(method = "euclidean") %>%
hclust(method = "centroid")
ggdendrogram(agrupamento_h_2d, rotate = TRUE)
data.frame(k = NROW(agrupamento_h_2d$height):1,
height = agrupamento_h_2d$height) %>%
ggplot(aes(x = k, y = height)) +
geom_line(colour = "grey") +
geom_point() +
labs(x = "Número de clusters produzido", y = "Dissimilaridade na junção")
Como podemos ver no gráfico de dissimilaridade, 4 é um número de grupos que podemos criar que apresenta uma boa divisão, com grupos de filmes que parecem ter uma semelhança. No gráfico de pontos abaixo, fica mais fácil visualizar os grupos e perceber que separar em quatro grupos nos dá uma boa divisão dos filmes.
agrupamento_h_2d = filmes %>%
column_to_rownames("TITLE") %>%
select(RATING, `BOX OFFICE`) %>%
mutate(`BOX OFFICE` = log10(`BOX OFFICE`)) %>%
mutate_all(funs(scale)) %>%
dist(method = "euclidean") %>%
hclust(method = "centroid")
ggdendrogram(agrupamento_h_2d, rotate = TRUE)
filmes2 = filmes %>% mutate(`BOX OFFICE` = log10(`BOX OFFICE`))
plota_hclusts_2d(agrupamento_h_2d,
filmes2,
c("RATING", "`BOX OFFICE`"),
linkage_method = "ward.D", ks = 4) + scale_y_log10()
distancias = filmes %>%
column_to_rownames("TITLE") %>%
select(RATING, `BOX OFFICE`) %>%
mutate(`BOX OFFICE` = log10(`BOX OFFICE`)) %>%
mutate_all(funs(scale)) %>%
dist(method = "euclidean")
plot(silhouette(cutree(agrupamento_h_2d, k = 4), distancias))
Podemos nomear os quatro grupos da seguinte maneira: os azuis são os ruins e de baixa arrecadação, os verdes os ruins de arrecadação média, os vermelhos são os bons de arrecadação média e os roxos são os médios de arrecadação alta.
Um exemplo claro de filme do grupo de filmes com qualidade média mas arrecadação alta são os filmes da franquia Star Wars. No grupo dos bons de arrecadação média temos V For Vendetta, um filme de baixo orçamento, porém muito aclamado, possui muitas críticas boas.
Também há nesse mesmo grupo Cisne Negro, um dos papéis mais marcantes na carreira da atriz e que a aclamou como uma grande atriz. É um dos filmes com maior nota.